package com.example.blog.controller;

import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.example.blog.base.PageResult;
import com.example.blog.base.Result;
import com.example.blog.entity.Article;
import com.example.blog.entity.dto.article.ArticleAddOrUpdateDTO;
import com.example.blog.entity.vo.article.ArticleDetailInfoVO;
import com.example.blog.entity.vo.article.ArticleListVO;
import com.example.blog.service.ArticleService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;

import java.util.List;

/**
 * 文章模块
 * <p>
 * 文章信息 前端控制器
 * </p>
 *
 * @author wlh
 * @since 2024-01-10
 */
@RestController
@RequestMapping("/blog/article")
public class ArticleController {

    @Autowired
    private ArticleService articleService;

    /**
     * 新增或者修改文章
     * @param articleAddOrUpdateDTO
     * @return
     */
    @PostMapping("/add-or-update")
    public Result<Void> addOrUpdate(@RequestBody @Validated ArticleAddOrUpdateDTO articleAddOrUpdateDTO) {
        articleService.addOrUpdate(articleAddOrUpdateDTO);
        return Result.success();
    }

    /**
     * 根据id删除指定文章
     * @param id 文章id
     * @return
     */
    @DeleteMapping("/{id}")
    public Result<Void> delete(@PathVariable Long id) {
        articleService.delete(id);
        return Result.success();
    }

    /**
     * 根据id获取文章信息
     * @param id 文章id
     * @return
     */
    @GetMapping("/{id}")
    public Result<Article> getDetail(@PathVariable Long id) {
        return Result.successData(articleService.getByIdNotNull(id));
    }

    /**
     * 阅读文章
     * @param id 文章ID
     * @return
     */
    @GetMapping("/view/{id}")
    public Result<ArticleDetailInfoVO> viewById(@PathVariable Long id) {
        ArticleDetailInfoVO article = articleService.viewById(id);
        return Result.successData(article);
    }

    /**
     * 获取收藏夹下收藏的内容
     * @param ffid 收藏夹ID
     * @return
     */
    @GetMapping("/follow")
    public Result<List<ArticleListVO>> getByFFId(@RequestParam("ffid") Long ffid) {
        List<ArticleListVO> data = articleService.getByFFId(ffid);
        return Result.successData(data);
    }

    /**
     * 搜索文章
     * @param value 文章标题/标签/摘要
     * @return
     */
    @GetMapping("/search")
    public PageResult<ArticleListVO> search(@RequestParam("value") String value,
                             @RequestParam("current") Integer current,
                             @RequestParam("size") Integer size) {

        Page<ArticleListVO> page = articleService.search(value, current, size);

        return PageResult.format(page);
    }


    /**
     * 审核/驳回文章
     * @param articleIds 文章ID集合
     * @param status 驳回/通过发布成功的status
     * @return
     */
    @PutMapping("/audit")
    public Result<Void> audit(@RequestParam("articleIds") List<Long> articleIds, @RequestParam("status") Integer status, @RequestParam("message")String message) {
        articleService.audit(articleIds, status, message);
        return Result.success();
    }


    /**
     * 处理后台分页查询文章的请求。
     *
     * @param current 当前页码，用于分页。
     * @param size 每页显示的数量，用于分页。
     * @param status 文章的状态，用于筛选文章。
     * @param title 文章的标题，部分匹配，用于筛选文章。
     * @return 返回一个封装了文章信息的分页结果对象。
     */
    @GetMapping("/back-page")
    public PageResult<Article> page(@RequestParam("current") Integer current, @RequestParam("size") Integer size,
                                    @RequestParam("status") Integer status, @RequestParam("title") String title) {

        // 调用文章服务层的分页查询方法，根据提供的条件进行查询
        Page<Article> page = articleService.backPage(current, size, status, title);
        // 将查询结果格式化为分页结果对象返回
        return PageResult.format(page);
    }


    /**
     * 根据用户获取文章列表
     * @param userId
     * @return
     */
    @GetMapping("/list")
    public Result<List<Article>> list(@RequestParam("userId") Long userId) {
        List<Article> articles = articleService.getListByUser(userId);

        return Result.successData(articles);
    }


    /**
     * 获取我的文章
     * @param status 状态值
     * @return
     */
    @GetMapping("/myList")
    public Result<List<Article>> myList(@RequestParam("status") Integer status) {
        List<Article> articles = articleService.myList(status);

        return Result.successData(articles);
    }

}
